from employee import Employee
import os


class EmployeeManagerSystem(object):
    def __init__(self):
        # 存放员工数据文件
        self.employee_data_file = 'employee.data'
        # 上次保存前的员工文件，而且只备份一次
        self.employee_data_file_backup = 'employee.data.backup'
        self.employee_list = []  # 从文件中加载之后的员工列表
        self.save_flag = True  # 已经保存员工数据

    def main(self):
        """员工管理系统的主入口"""

        # 1 加载和读取员工数据文件
        self.load_employee()
        while True:
            # 2 显示系统欢迎界面
            self.show_hello()
            # 3用户输入指定编号退出
            menu_number = int(input('请输入功能编号：'))
            if menu_number == 7:
                self.go_out()
                break
            elif menu_number == 1:
                self.add_employee()
            elif menu_number == 2:
                self.del_employee()
            elif menu_number == 3:
                self.update_employee()
            elif menu_number == 4:
                self.search_employee()
            elif menu_number == 5:
                self.show_all_employee()
            elif menu_number == 6:
                self.save_employee()

    def go_out(self):
        """
        如果进行了添加修改删除 必须要保存下
        没保存自动保存
        怎样自动保存
        :return:
        """
        if not self.save_flag:  # 没有保存
            self.save_employee()
        print('谢谢，程序退出')

    def save_employee(self):
        """
        保存步骤
        1、先把原来的数据文件备份一下（如果已经存在备份文件，则删除）
        2、创建新文件
        3、写入数据
        4、关闭文件流
        :return:
        """

        if os.path.exists(self.employee_data_file_backup):
            os.remove(self.employee_data_file_backup)  # 删除备份文件
        # 备份
        os.rename(self.employee_data_file, self.employee_data_file_backup)
        # 打开文件流
        with open(self.employee_data_file, 'w', encoding='gbk') as f:
            # 写入数据
            new_list = []
            for emp in self.employee_list:  # 原来的列表中是一个emp对象
                # 对象不能直接保存在文件中
                new_list.append(emp.__dict__)
                # new_list:[{}]
            f.write(str(new_list))
        self.save_flag = True  # 手动保存

    def show_all_employee(self):
        """展示所有信息"""
        print('姓名\t年龄\t性别\t手机号码\t是否离职')
        for emp in self.employee_list:
            print(emp)

    def search_employee(self):
        """根据姓名查找"""
        # 1 输入员工姓名
        search_name = input("请输入要查询员工的姓名：")
        # 2 遍历员工列表 存在删除
        for emp in self.employee_list:
            if emp.name == search_name:
                print(emp)
                break
        else:
            print(f'当前系统无{search_name}')

    def update_employee(self):
        """修改员工"""
        # 1 输入员工姓名
        update_name = input("请输入要修改员工的姓名：")
        # 2 遍历员工列表 存在修改
        for emp in self.employee_list:
            if emp.name == update_name:
                self.save_flag = False
                new_name = input('请输入新的姓名(不修改直接回车)：').strip()
                emp.name = new_name if new_name else emp.name

                new_gender = input('请输入新的性别(不修改直接回车)：').strip()
                emp.gender = new_gender if new_gender else emp.gender

                new_age = input('请输入新的年龄(不修改直接回车)：').strip()
                emp.age = int(new_age) if new_age else emp.age

                new_mobile_number = input('请输入新的电话(不修改直接回车)：').strip()
                emp.mobile_number = new_mobile_number if new_mobile_number else emp.mobile_number

                new_leave = input('请输入新的离职信息(不修改直接回车)：').strip()
                if new_leave:
                    emp.is_leave = True if int(new_leave) == 1 else False

                print('员工信息已经修改完成：')
                print(emp)

                break
        else:  # 循环正常结束
            print(f'当前系统无{update_name}')

    def del_employee(self):
        """删除员工信息"""

        # 1 输入员工姓名
        del_name = input("请输入要删除员工的姓名：")
        # 2 遍历员工列表 存在删除
        for emp in self.employee_list:
            if emp.name == del_name:
                self.save_flag = False
                self.employee_list.remove(emp)
                print(f'名叫{del_name}已经删除')
                break
        else:
            print(f'当前系统无{del_name}')

    def add_employee(self):
        """添加员工信息"""
        # 1 由用户输入需要添加的员工信息
        name = input('请输入员工姓名:')
        gender = input('请输入员工性别:')
        age = int(input('请输入员工年龄:'))
        mobile_number = input('请输入员工手机号码:')
        is_leave = int(input('请输入员工是否离职，1表示离职，0表示在职:'))

        # 创建一个员工对象
        emp = Employee(name, gender, age, mobile_number, is_leave)
        # 3 把新加入的员工加入到列表中
        self.employee_list.append(emp)
        self.save_flag = False
        # 4 输入员工信息
        print(emp)

    @staticmethod
    def show_hello():
        # 显示系统欢迎界面
        print('欢迎进入企业管理系统')
        print("-" * 60)
        print('1:添加员工')
        print('2:删除员工')
        print('3:修改员工')
        print('4:查找员工')
        print('5:展示所有员工')
        print('6:保存员工数据')
        print('7:退出系统')
        print("-" * 60)

    def load_employee(self):
        """
        读取员工数据文件，把所有的员工信息都放到员工列表
        :return:
        """
        try:
            f = open(self.employee_data_file, 'r')
        except Exception as err:
            # 如果报错，有可能第一次启动程序，这个文件不存在
            f = open(self.employee_data_file, 'w')
        else:  # 没有报错，文件存在
            # 读取文件中的数据
            data = f.read()
            if data:
                lst = eval(data)  # 把文件的内容当成python表达式解析
                for dict1 in lst:
                    self.employee_list.append(
                        Employee(dict1['name'], dict1['gender'], dict1['age'], dict1['mobile_number'],
                                 dict1['is_leave']))
        finally:
            if f:
                f.close()


if __name__ == '__main__':
    sys = EmployeeManagerSystem()
    sys.main()
